package com.baozhun.mall.common.widget

import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import androidx.viewpager.widget.ViewPager


/**
 * Intro: 解决 滑动冲突的 ViewPager
 *
 *
 * 因为ViewPager 和 SwipMenuLayout都是水平方向滑动的控件。
 * 所以在一起使用时会有冲突，
 * 使用本控件(CstViewPager)，可以在ViewPager的第一页使用左滑。在ViewPager的最后一页使用右滑菜单。
 *
 *
 * Author: zhangxutong
 * E-mail: mcxtzhang@163.com
 * Home Page: http://blog.csdn.net/zxt0601
 * Created:   2017/9/27.
 * History:
 */
class CstViewPager : ViewPager {
    private var mLastX = 0
    private var mLastY = 0

    constructor(context: Context?) : super(context!!)
    constructor(context: Context?, attrs: AttributeSet?) : super(context!!, attrs)

    override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
        //Log.i(TAG, "onInterceptTouchEvent() called with: ev = [" + ev + "]");
        val x = ev.x.toInt()
        val y = ev.y.toInt()
        var intercept = false
        when (ev.action) {
            MotionEvent.ACTION_DOWN -> {}
            MotionEvent.ACTION_MOVE -> if (isHorizontalScroll(x, y)) {
                //除了在 第一页的手指向右滑 ， 最后一页的左滑，其他时刻都是父控件需要拦截事件
                intercept = if (isReactFirstPage && isScrollRight(x)) {
                    //Log.e(TAG, "第一页的手指向右滑]");
                    false
                } else !(isReachLastPage && isScrollLeft(x))
            } else {
            }

            MotionEvent.ACTION_UP -> {}
            else -> {}
        }
        mLastX = x
        mLastY = y
        val onInterceptTouchEvent = super.onInterceptTouchEvent(ev)
        return intercept || onInterceptTouchEvent
    }

    override fun onTouchEvent(ev: MotionEvent): Boolean {
        //Log.i(TAG, "onTouchEvent() called with: ev = [" + ev + "]");
        return super.onTouchEvent(ev)
    }

    //是否在水平滑动
    private fun isHorizontalScroll(x: Int, y: Int): Boolean {
        return Math.abs(y - mLastY) < Math.abs(x - mLastX)
    }

    private val isReachLastPage: Boolean
        //是否未到达最后一页
        private get() {
            val adapter = adapter
            return null != adapter && adapter.count - 1 == currentItem
        }
    private val isReactFirstPage: Boolean
        //是否在第一页
        private get() = currentItem == 0

    //是否左滑
    private fun isScrollLeft(x: Int): Boolean {
        return x - mLastX < 0
    }

    private fun isScrollRight(x: Int): Boolean {
        return x - mLastX > 0
    }

    //复写该方法，控制是否支持横滑，false 不支持横滑
    override fun canScrollHorizontally(direction: kotlin.Int): kotlin.Boolean {
        return return false
    }

    companion object {
        private const val TAG = "zxt/CstViewPager"
    }
}